package com.xfanonymous.cloud.resp;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.experimental.Accessors;

/**
 * Copyright (c) 2023-2033 All Rights Reserved
 *
 * @Date: 2024/3/6
 * @Description: 返回结果统一类型
 *
 * 1. @Accessors(chain = true) lombok链式编程，可以使用链式set方法，且setter方法返回当前对象，替代void。
 * 2. 构造方法对时间戳赋值，每次调用接口方法获取返回值时，都获取当前时间 System.currentTimeMillis();
 *
 * 泛型
 * 1. 声明方法时，在返回值前添加`<T>`表示当前函数使用了泛型变量
 */

@Data
@Accessors(chain = true)
public class ResultData<T> {
    private String code;
    private String message;
    private T data;
    private Long timestamp;

    // 每次调用接口方法时，都对时间戳赋值
    public ResultData() {
        this.timestamp = System.currentTimeMillis();
    }

    // 执行成功
    public static <T> ResultData<T> success(T data) {
        ResultData resultData = new ResultData<>();
        resultData.setCode(ReturnCodeEnum.RC200.getCode());
        resultData.setMessage(ReturnCodeEnum.RC200.getMessage());
        resultData.setData(data);

        return resultData;

        // 链式调用方法
//        return new ResultData().setCode(ReturnCodeEnum.RC200.getCode())
//                .setMessage(ReturnCodeEnum.RC200.getMessage())
//                .setData(data);
    }

    // 执行失败
    public static <T> ResultData<T> fail(String code, String message) {
        ResultData resultData = new ResultData<>();
        resultData.setCode(code);
        resultData.setMessage(message);
        resultData.setData(null);
        return resultData;
    }

}
